package com.sykj.fileupload.util;

import java.util.HashSet;
import java.util.Random;

/**
 * @Author: zjw
 * @Date: 2017/2/18 13:55
 * @Description:
 * 随机数工具类
 */
public class RandomTool {

    /**
     * 私有化构造方法
     */
    private RandomTool() {
    }

    /**
     * 返回长度为4的16进制字符
     * @return
     */
    public static String stringLength4() {
        return Integer.toHexString((int) Math.floor((Math.random() + 1) * 0x1000));
    }

    /**
     * 随机生成5位字符串
     * @return
     */
    public static String getRandomString() {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//含有字符和数字的字符串
        Random random = new Random();//随机类初始化
        StringBuffer sb = new StringBuffer();//StringBuffer类生成，为了拼接字符串
        for (int i = 0; i < 5; i++) {
            int number = random.nextInt(62);// [0,62)
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    /**
     * 随机出指定范围内n个不重复的数
     * @param min 指定范围最小值
     * @param max 指定范围最大值
     * @param n 随机数个数
     * @param set 随机数结果集
     */
    public static void randomSet(int min, int max, int n, HashSet<Integer> set) {
        if (n > (max - min + 1) || max < min) {
            return;
        }
        // 差多少个数就产生多少个随机数
        for (int i = 0; i < n - set.size(); i++) {
            // 调用Math.random()方法
            int num = (int) (Math.random() * (max - min)) + min;
            set.add(num);// 将不同的数存入HashSet中
        }
        // 如果存入的个数小于指定的个数，则调用递归再生成剩余个数的随机数，如此循环，直到达到指定大小
        if (set.size() < n) {
            randomSet(min, max, n, set);// 递归
        }
    }

}
